#ifndef SYSCALLS_H_
#define SYSCALLS_H_

//tipos de system call
typedef enum {READFILE, WRITEFILE, YIELD, ST_PROCESS, WAIT, KILL, GET_PROC,
	DEBUG_CALL, VIDEO_POS, VIDEO_CLR, VIDEO_CUR, VIDEO_ATTR, SLEEP, MKDIR,
	OPENDIR, CLOSEDIR, READDIR, CHDIR, GETCWD, OPENFILE, CLOSEFILE,
	RENAME, UNLINK, FILESIZE} syscallOpNum;
//cantidad de syscalls
#define CANT_SYSCALLS 24

//trata de leer count bytes del archivo referenciado por el fileDescriptor fd,
// los deja en buffer y devuelve la cantidad leida. los flags indican una
// llamada bloqueante o no
int read(int fd, char * buffer, int count, int flags);

//trata de escribir count bytes en el archivo referenciado por el
//fileDescriptor fd de buffer y devuelve la cantidad escrita.
int write(int fd, char * buffer, int count, int flags);

//crea o abre el archivo que se encuentra en pathName
//devuelve -1 en caso de error o un file descriptor en caso de exito
int open(char * pathName, short int mode);

//cierra el archivo referenciado por el file descriptor fd
void close(int fd);

//systemcall para ceder el procesador
int yield(void);

typedef struct
{
	int (*process)(int,char**);
	char * procName;
}stProcessAux;

//systemcall para crear nuevos procesos
int startProcess(int (*process)(int,char**), char * procName, char isBackground,
	int argc, char ** argv, unsigned char priority);

//se bloquea hasta que un pid lo despierte
void waitPid(int pid);

void kill(int pid);

int getProcs(void * procs, int maxProcs);

//DEBUG para llamar cualquier cosa que un proceso no pueda de forma rapida
int debugCall(void);

//estas funciones setean y buscan la posicion x e y actual de la video
int getVideoXY(int * x, int * y);
int setVideoXY(int x, int y);

//estas funciones muestran o esconden el cursor de video
void showCursor(void);
void hideCursor(void);

//cambia el atributo de la video por attr
void videoAttr(char attr);

//hace clear del buffer de video
int clear(void);

//hace dormir al proceso que hace el call durante 'segundos' segundos
int sleep(int segundos);


#include "../include/fileSystem/dirent.h"

//trata de crear un nuevo directorio, con mode siendo sus permisos
//devuelve -1 en caso de falla
int mkdir(char * pathName, short int mode);

//trata de abrir un directorio. devuelve -1 en caso de error, o un
//file descriptor en caso de exito
int opendir(char * pathName);

//cierra el directorio referenciado por el file descriptor fd
void closedir(int fd);

//deja una entrada del directorio en entry, y queda apuntando a la proxima.
//devuelve -1 en caso de error o si se acabaron las entradas
int readdir(int fd, dirEntry * entry);

//trata de cambiar el directorio actual del proceso que hizo la llamada
//devuelve -1 en caso de error
int chdir(char * path);

//deja en name el path del directorio actual si su longitud es menor a size y
//lo devuelve, sino devuelve NULL
char * getcwd(char * name, int size);

//cambia el nombre del archivo o directorio en oldPath por el de newPath.
//devuelve un valor negativo en caso de error
int rename(const char * oldPath, const char * newPath);

//trata de borrar un archivo. Devuelve -1 en caso de error.
int unlink(const char * path);
//trata de borrar un directorio. El directorio debe estar vacio.
//Devuelve -1 en caso de error.
int rmdir(const char * path);

//devuelve el tamaño del archivo o directorio en path, o -1 en caso de error
int getFileSize(const char * path);

#endif /* SYSCALLS_H_ */
